package com.itheima;

import com.itheima.domain.User;
import com.itheima.domain.User2;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisDemo {
    private SqlSession sqlSession;

    @Before
    public void init() throws IOException {
        // 加载核心配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");

        // 获取SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        // 获取SqlSessionFactory
        SqlSessionFactory factory = builder.build(in);

        // 获取连接SqlSession
        sqlSession = factory.openSession();
    }

    @After
    public void destroy() {
        sqlSession.commit();  // mybatis 默认手动提交事务

        sqlSession.close();
    }

    // 查询所有数据
    @Test
    public void findAll() throws IOException {
        // 执行查询   对象映射配置文件  命名空间+id
        List<User> list = sqlSession.selectList("userMapper.findAll");
        // 处理结果
        for (User user : list) {
            System.out.println(user);
        }
    }

    // 根据id查询
    @Test
    public void findById(){
        User user = sqlSession.selectOne("userMapper.findById", 1);
        System.out.println(user);
    }

    // 模糊查询  $方式
    @Test
    public void findByName(){
        List<User> list = sqlSession.selectList("userMapper.findByName", "张");
        for (User user : list) {
            System.out.println(user);
        }
    }

    // 模糊查询  #方式
    @Test
    public void findByName2(){
        List<User> list = sqlSession.selectList("userMapper.findByName2","%张%");
        for (User user : list) {
            System.out.println(user);
        }
    }

    // 添加数据
    @Test
    public void saveUser() {
        User user = new User(7,"haha",29);
        sqlSession.insert("userMapper.saveUser", user);
    }

    // 添加数据并返回主键ID
    @Test
    public void saveUserReturnId() {
        User user = new User(10,"嘿嘿嘿",29);
        System.out.println("添加之前：" + user);         // 保存前：没有id
        sqlSession.insert("userMapper.saveUser", user);
        System.out.println("添加之后：" + user);         // 保存后：有id属性值
    }

    // 修改数据
    @Test
    public void updateUser(){
        User user = new User(1,"张三三",25);
        sqlSession.update("userMapper.updateUser",user);
    }

    // 删除数据
    @Test
    public void delete(){
        sqlSession.delete("userMapper.delete", 10);
    }

    /*
        查询结果集深入:
            表的字段 和 对象属性 不一致
            方案一: 给查询的结果字段起别名, 让字段名和属性名一致
     */
    @Test
    public void findAll2(){
        List<User2> users =  sqlSession.selectList("userMapper.findAll2");
        for (User2 user : users) {
            System.out.println(user);
        }
    }

    /*
      查询结果集深入:
          表的字段 和 对象属性 不一致
          方案二: 手动配置 列 和 对象属性映射关系
   */
    @Test
    public void findAll3(){
        List<User2> users =  sqlSession.selectList("userMapper.findAll3");
        for (User2 user : users) {
            System.out.println(user);
        }
    }
}
